#include "Score.h"

Score::Score(Score_struct score , SDL_Surface *ecran) : Affichable(ecran) {
	coul_noir.r = coul_noir.g = coul_noir.b = 0;

	TTF_Font *police = TTF_OpenFont("arial.ttf", 12);
	text = TTF_RenderText_Blended(police, score.nom.c_str() , coul_noir);
	TTF_CloseFont(police);

	SDL_Surface *im = SDL_CreateRGBSurface(SDL_HWSURFACE , text->w + 10 , 2 , 32, 0, 0, 0, 0);
	SDL_FillRect(im, NULL, SDL_MapRGB(im->format, 0, 0, 0));

	//l'image qui va conteni le texte + le trait
    SDL_Surface *imageGlob = SDL_CreateRGBSurface(SDL_HWSURFACE , text->w + 10 , text->h+2, 32, 0, 0, 0, 0);
    SDL_FillRect(imageGlob, NULL, SDL_MapRGB(imageGlob->format, 0,255, 255));

    //on affiche le texte sur l'image
	SDL_Rect pos ;
	pos.x = imageGlob->w - text->w;
	pos.y = 0;
	SDL_BlitSurface(text,NULL,imageGlob,&pos);

	//on affiche l trait sous le texte
	pos.y = imageGlob->h - im->h;
	pos.x = 0;
    SDL_BlitSurface(im,NULL,imageGlob,&pos);


	setImage(imageGlob);

	position.x = ecran->w-imageGlob->w ;
	position.y = -score.val+ecran->h;

    y =  -score.val+ecran->h;

    SDL_FreeSurface(im);
    SDL_FreeSurface(text);
}

void Score::afficher(){
    position.y = y;
    Affichable::afficher();
}

SDL_Rect Score::getPosition(){
    position.y = y;
    return position;
}
void Score::decaler(int nombre){
    y += nombre;
}
/**
    si on est a la fin du fichier alors on retourne comme valeur 0
*/
Score_struct Score::lireScore(FILE *f){
    Score_struct sc;
    sc.val = 0;
    sc.nom = "";

    int taille , score ;
    char val[100];
    val[0] = '\0';

    if(feof(f) || fread(&(score),sizeof(int),1,f) < 1)
        return sc;

    if(feof(f) || fread(&taille,sizeof(int),1,f) < 1)
        return sc;

    if(feof(f) || taille < 0 || taille > 30 || fread(&val,sizeof(char) , taille , f) < taille )
        return sc;

    val[taille] = '\0';
    sc.nom = val;
    sc.val = score;

    return sc;
}

 Score_struct Score::lireScore(FILE *f , int *nbOctet){
    Score_struct sc;
    sc.val = 0;
    sc.nom = "";

    *nbOctet = 0;

    int taille , score ;
    char val[100];
    val[0] = '\0';

    if(feof(f) || fread(&(score),sizeof(int),1,f) < 1)
        return sc;

    if(feof(f) || fread(&taille,sizeof(int),1,f) < 1)
        return sc;

    if(feof(f) || taille < 0 || taille > 30 || fread(&val,sizeof(char) , taille , f) < taille )
        return sc;

    val[taille] = '\0';
    sc.nom = val;
    sc.val = score;

    *nbOctet = sizeof(int)*2+taille*sizeof(char);

    return sc;
 }

void Score::saveScore(FILE *f , Score_struct score)
{
    fwrite(&(score.val) , sizeof(int) , 1 , f) ;
    int taille = score.nom.size();
    const char *val = score.nom.c_str();
    fwrite(&taille , sizeof(int) , 1 , f);
    fwrite(val,sizeof(char) , taille , f);
}
